﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication16
{
    public partial class MainForm : Form
    {
        TextBox[,] tb = new TextBox[9, 9];
        public MainForm()
        {
            InitializeComponent();
            Init_T();
            //SendRes.Text = "Проверить";
            LoadFromFile(Environment.CurrentDirectory + "\\db.dbf");

        }
        public void Init_T()
        {
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    tb[i, j] = new TextBox();
                    tb[i, j].Location = new Point(41 * j, (41 * i)+25);
                    tb[i, j].Size = new Size(40, 40);
                    
                    tb[i, j].BackColor = Color.Beige;
                    tb[i, j].Font = new Font("Times", 21);
                   

                    tb[i,j].Validating += new CancelEventHandler(TextBox_Validating);
                    tb[i, j].Validating += new CancelEventHandler(Proverka_on_End);
                    tb[i, j].Tag = i * 9 + j;
                    
                    this.Controls.Add(tb[i, j]);
                    tb[i,j].TextAlign = HorizontalAlignment.Center;

                }
            }
            this.Size = new Size(385, 432);
            

 
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
 

        }
       
       

       /* public override void Draw(Graphics G)
        {
            Pen p = new Pen(this.col);
            G.DrawLine(p, x, y, a, b);
        }*/

        private void TextBox_Validating(object sender, CancelEventArgs e)
        {
            foreach (TextBox tbf in tb)
                tbf.BackColor = Color.White;

            TextBox textBox = (TextBox)sender;
            
            if (string.IsNullOrWhiteSpace(textBox.Text))
                return;

            if (!Char.IsDigit(textBox.Text[textBox.Text.Length - 1]) || int.Parse(textBox.Text) > 9 || int.Parse(textBox.Text) < 1)
            {
                //if (string.IsNullOrWhiteSpace(textBox.Text) || int.Parse(textBox.Text) > 9 || int.Parse(textBox.Text) < 0) 
                MessageBox.Show("Вы допустили ошибку, проверьте!");
                textBox.Text = "";
            }
            //if(int.Parse(tbcl[tbcl.Length-1].Text)>9)
           /* for(int i=0;i<9;i++)
                 for (int j = 0; j < 9; j++)
                 {

                    // if (!((tb[i, j].Text[0].Length == 1) && Char.IsDigit(tb[i, j].Text[0])))
                     if (int.Parse(tb[i, j].Text) > 9) 
                         MessageBox.Show("Вы допустили ошибку, проверьте!");
                 }*/
              

            int tag = (int)((Control)sender).Tag;
            int k = tag / 9;
            int l = tag % 9;
            if (tb[k, l].Text != "")
            {
                Proverka();

            }
        }

        public void NewGame()
        {
            Random rd = new Random();
            int m, p, g;
            m = rd.Next(180, 256);
            p = rd.Next(180, 256);
            g = rd.Next(180, 256);
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    tb[i, j].Text = "";
                    tb[i, j].BackColor = Color.FromArgb(m, p, g);
                }
            }
        }

       

        
        int[,] Pole = new int[9, 9];

       
        private void Proverka()
        {
            bool flag = false;
            for (Int32 i = 0; i < 9; i++)
            {
                for (Int32 j = 0; j < 9; j++)
                {
                    

/*int n=0;
                    int r=0;       
                    while (n / 3 != (i / 3 + 1) && r / 3 != (j / 3 + 1))
                            {
                    for ( n = 0; n < 9; n++)
                        for (r = 0; r < 9; r++)
                        {
                                if (Pole[i, j] == Pole[n, r])
                                {
                                    flag=true;
                                    tb[i, j].BackColor = Color.Red;
                                }
                            }
                        }*/

                   int xstart = (i / 3) * 3;
                   int ystart = (j / 3) * 3;

                   for (int x = xstart; x < xstart + 3; x++ )
                       for (int y = ystart; y < ystart + 3; y++)
                       {
                           if ((tb[i, j].Text != "") && ((x != i) || (y != j)) && (tb[i, j].Text == tb[x, y].Text))
                           {
                               flag = true;
                               tb[i, j].BackColor = Color.Aqua;
                           }
                       }
                       for (int m = 0; m < 9; m++)
                       {
                           if ((tb[i, j].Text != "") && (((tb[i, j].Text == tb[m, j].Text) && (m != i)) || ((tb[i, j].Text == tb[i, m].Text) &&(m != j))))
                             
                           {
                               flag = true;
                               tb[i, j].BackColor = Color.Purple;
                           }
                       }
                }
            }
            if (flag == true)
            {
                MessageBox.Show("Ошибка, проверьте");
            }
           
        }

        private void Proverka_on_End(object sender, CancelEventArgs e)
        {
            int test = 0;
            for (int i = 0; i < 9; i++)
                for (int j = 0; j < 9; j++)
                {
                    if (tb[i, j].Text!= "")
                    {
                        test = test + 1;
                    }
                }
            if (test == 81)
            { MessageBox.Show("Игра закончена. Вы выиграли"); }
            
        }
      
        private void Vvod()
        {
            for (int i = 0; i < 9; i++)
                for (int j = 0; j < 9; j++)
                {
                    if (Pole[i, j] != 0)
                    {
                        
                     
                        tb[i, j].Text = Pole[i, j].ToString();
                        tb[i, j].ReadOnly = true;
                    }
                }
        }

        private void LoadFromFile(string way)
        {
            StreamReader sr = new StreamReader(way, Encoding.Default);
            Int32 param = 0;
            string s;

            while (!sr.EndOfStream)
            {
                s = sr.ReadLine();
                param++;
            }

            sr.Close();

            param /= 9;

            Random rnd = new Random();
            param = rnd.Next(param);

            StreamReader sq = new StreamReader(way, Encoding.Default);

            Int32 purum = 0;

            while ((purum / 9) < param)
            {
                s = sq.ReadLine();
                purum++;
            }

            for (Int32 i = 0; i < 9; i++)
            {
                s = sq.ReadLine();
                for (Int32 j = 0; j < 9; j++)
                    (Pole[i, j]) = s[j] - '0';
            }

            sq.Close();
        }

        

        private void начатьИгруToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            NewGame();
            //SendRes.Text = "Проверить";
            LoadFromFile(Environment.CurrentDirectory + "\\db.dbf");
            Vvod();

        }

        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try//открытие комманды для отлова ошибок
            {
                { //спрашивает пользователя действительно ли он хочет выйти
                    if (MessageBox.Show("Вы точно хотите покинуть прграмму?", "Информация", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)// если нажата кнопка Yes то выход из программы
                        Application.Exit();//выход из программы
                }
            }
            catch { MessageBox.Show("Ошибка!"); }//ошибка
        }


        private void MainForm_Load(object sender, EventArgs e)
        {
           // SendRes.Text = "Проверить";
            LoadFromFile(Environment.CurrentDirectory + "\\db.dbf");
            Vvod();
        }

        private void сохранитьИгруToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.Default);

                for (Int32 i = 0; i < 9; i++)
                {
                    for (Int32 j = 0; j < 9; j++)
                        if (tb[i, j].Text == "")
                            sw.Write("_");
                        else
                            sw.Write(tb[i, j].Text);
                    sw.WriteLine();
                }

                sw.Close();
            }
        }

        private void открытьИгруToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.Default);

                string s;

                for (Int32 j = 0; j < 9; j++)
                {
                    s = sr.ReadLine();

                    for (Int32 i = 0; i < s.Length; i++)
                        if (s[i] == '_')
                            tb[i, j].Text = "";
                        else
                        {
                            tb[j, i].Text = s[i].ToString();
                            tb[i, j].ReadOnly = true;
                        }
                }

                sr.Close();
            }
        }

        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try//открытие комманды для отлова ошибок
            {
                this.Hide();
                Oprogramme f = new Oprogramme();
                f.ShowDialog();
                this.Close();
            }
            catch { MessageBox.Show("Ошибка!"); }//ошибка
        }

      

        

       /* private void SendRes_Click(object sender, EventArgs e)
        {
            Proverka_on_End();
        }*/
    }
}